/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package edu.ucue.ptc.gco.ngc;

import edu.ucue.ptc.gco.dao.EmpleadoDAOLocal;
import edu.ucue.ptc.gco.dao.RutaDAOLocal;
import edu.ucue.ptc.gco.mdl.Direccion;
import edu.ucue.ptc.gco.mdl.Empleado;
import edu.ucue.ptc.gco.mdl.Ruta;
import edu.ucue.ptc.gco.util.AtributoInvalidoException;
import edu.ucue.ptc.gco.util.ElementoYaExisteException;
import edu.ucue.ptc.gco.util.ValidarAtributoUtil;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.ejb.EJB;
import javax.ejb.Stateless;
import javax.inject.Inject;
import javax.persistence.Query;

/**
 *
 * @author Valex
 */
@Stateless
public class RutaManager implements RutaManagerLocal {

    // Add business logic below. (Right-click in editor and choose
    // "Insert Code > Add Business Method")
    @Inject
    private RutaDAOLocal rutaDao;
    @Inject
    private EmpleadoDAOLocal empleadoDao;
//    @Inject
//    private RutaDireccionDAOLocal rutaDireccionDao;
    @EJB
    private EmpleadoManagerLocal ejbEmpleado;
    @EJB
    private DireccionManagerLocal ejbDireccion;
    @EJB
    private UsuarioManagerLocal ejbRefUsuario;
    
    @Override
    public void crear(Ruta ruta) throws AtributoInvalidoException, ElementoYaExisteException, Exception {

        ValidarAtributoUtil.validarObjetoNulo("ruta", ruta);
        ValidarAtributoUtil.validarObjetoNulo("empleado", ruta.getEmpleado());
        try {
            Ruta p = this.obtenerPorId(ruta.getIdRuta());
            Empleado c = ejbEmpleado.buscarEmpleadoPorCedula(ruta.getEmpleado().getCedulaRuc(), "", "");

            if (p != null) {
                throw new ElementoYaExisteException("Ruta con id " + p + " ya existe.");
            } else if (c == null) {
                throw new AtributoInvalidoException("empleado", ruta.getEmpleado().getCedulaRuc(), "La ruta debe tener un empleado que exista");
            }
            rutaDao.crearRuta(ruta);
        } catch (Exception ex) {


            if (ex instanceof ElementoYaExisteException) {
                throw (ElementoYaExisteException) ex;
            } else if (ex instanceof AtributoInvalidoException) {
                throw (AtributoInvalidoException) ex;
            }

        }

    }

    @Override
    public void crear(Ruta ruta, List<Direccion> direcciones, String user, String pass) throws AtributoInvalidoException, ElementoYaExisteException, Exception {

        ValidarAtributoUtil.validarObjetoNulo("ruta", ruta);
        ValidarAtributoUtil.validarObjetoNulo("empleado", ruta.getEmpleado());

        try {
            Ruta p = this.obtenerPorId(ruta.getIdRuta());
            Empleado c = ejbEmpleado.buscarEmpleadoPorCedula(ruta.getEmpleado().getCedulaRuc(), user, pass);

            if (p != null) {
                throw new ElementoYaExisteException("Ruta con id " + p + " ya existe.");
            } else if (c == null) {
                throw new AtributoInvalidoException("empleado", ruta.getEmpleado().getCedulaRuc(), "La ruta debe tener un empleado que exista");
            } else if (direcciones != null && direcciones.size() > 0) {
                for (Direccion dir : direcciones) {
                    Direccion direccion = ejbDireccion.obtenerPorId(dir.getIdDireccion() + "", user, pass);
                    if (direccion == null) {
                        throw new AtributoInvalidoException("direccion", dir.getIdDireccion(), "La direccion con id " + dir.getIdDireccion() + " no existe");

                    }
                    
                    /*  RutaDireccion ruta_direccion=new RutaDireccion();
                     ruta_direccion.setIdDireccion(direccion);
                     ruta_direccion.setIdRuta(ruta);
                     rutaDireccionDao.crear(ruta_direccion*/
                }
                ruta.setDirecciones(direcciones);
            }
            rutaDao.crearRuta(ruta);
        } catch (Exception ex) {


            if (ex instanceof ElementoYaExisteException) {
                throw (ElementoYaExisteException) ex;
            } else if (ex instanceof AtributoInvalidoException) {
                throw (AtributoInvalidoException) ex;
            }

        }

    }

    @Override
    public void actualizar(Ruta ruta,String user,String password) throws AtributoInvalidoException {
        ValidarAtributoUtil.validarObjetoNulo("empleado", ruta.getEmpleado());
        try {
            Ruta p = this.obtenerPorId(ruta.getIdRuta());
            Empleado c = ejbEmpleado.buscarEmpleadoPorCedula(ruta.getEmpleado().getCedulaRuc(),user,password);

            if (p == null) {
                throw new AtributoInvalidoException("ruta", ruta.getIdRuta(), "El producto con id " + ruta.getIdRuta() + " debe existir");
            } else if (c == null) {
                throw new AtributoInvalidoException("empleado", ruta.getEmpleado().getCedulaRuc(), "La ruta debe tener un empleado que exista");
            }

            rutaDao.actualizarRuta(ruta);
        } catch (Exception ex) {
            ex.printStackTrace();
            // throw new Exception("Error desconocido: " + ex.getLocalizedMessage() + " - " + ex.getCause());
        }
    }

    @Override
    public void eliminar(Ruta ruta) {
        rutaDao.eliminarRuta(ruta);
    }

    /*   @Override
     public void eliminarPorId(int id) {
     rutaDao.eliminarPorId(id);
     }*/
    @Override
    public List<Ruta> listarTodos() {
        return rutaDao.listarTodosRuta();
    }

    @Override
    public Ruta obtenerPorId(int idRuta) {
        return rutaDao.obtenerRutaPorId(idRuta);
    }

    /**
     *
     * @param idRuta
     * @return
     */
    @Override
    public List<Direccion> obtenerDireccionesRuta(int idRuta) {
        /*      List<RutaDireccion> lista = rutaDao.obtenerDireccionesRuta(idRuta);
         DireccionManager dirManager;
         List<Direccion> direcciones= new ArrayList<Direccion>();
         Iterator iter = lista.iterator();
         while (iter.hasNext()) {
         RutaDireccion obj = (RutaDireccion) iter.next();
         Direccion dir = obj.getIdDireccion();
         direcciones.add(dir);
         }*/
        List<Direccion> direcciones = new ArrayList<Direccion>();
        return direcciones;
    }

    @Override
    public List<Ruta> rutasEmpleado(String cedula, String user, String pass) throws AtributoInvalidoException {

        Empleado empleado = ejbEmpleado.buscarEmpleadoPorCedula(cedula, user, pass);
        int idEmpleado = empleado.getIdPersona();
        return rutaDao.rutasEmpleado(idEmpleado);
    }
    
    public Ruta rutaEmpleado(int persona,String user, String pass){
        try {       
               ejbRefUsuario.existeUsuario(user, pass);
               Empleado empleado = ejbEmpleado.buscarEmpleadoPorId(persona, user, pass);
        } catch (AtributoInvalidoException ex) {
            Logger.getLogger(RutaManager.class.getName()).log(Level.SEVERE, null, ex);
        }
       Ruta ruta=rutaDao.rutaEmpleado(persona);
       return ruta;
    }
    
    public Ruta quitarDireccion(int idRuta,Direccion direccion){
        return rutaDao.quitarDireccion(idRuta, direccion);
    }
    
    public Ruta agregarDireccion(int idRuta,Direccion direccion){
        return rutaDao.agregarDireccion(idRuta, direccion);
    }
    
    public List<Direccion> obtenerDireccionRutaPorId(int idRuta){
        return rutaDao.obtenerDireccionRutaPorId(idRuta);
    }
    
}
